/*
 * libdlm.h
 *
 *
 */

#ifndef LIBDLM_H_
#define LIBDLM_H_

/*
 * Types used by DLM
 */
typedef int resource_id_t;
typedef int lock_type_t;
typedef long timeout_t;
typedef int r_code_t;

/*
 * 	DLM lock types
 */
#define DLM_lock_CR			0	/* Concurrent Read */
#define	DLM_lock_CW			1	/* Concurrent Write */
#define	DLM_lock_PR			2	/* Protected Read */
#define	DLM_lock_PW			3	/* Protected Write */
#define DLM_lock_Ex			4	/* Exclusive */

#define DLM_lock_unlock		5	/* unlock resource */

#define DLM_lock_count		5	/* locks */
/*
 * 	DLM timeout
 */
#define DLM_non_block	-1
#define	DLM_timeout_inf	0

/*
 * 	For replies code
 */
#define DLM_reply_OK	0
#define	DLM_reply_NOT	1

/*
 *	DLM_init() inicjalizuje zasób, który jest reprezentowany przez ścierzkę `path'.
 *	Id zarejestrowanego zasobu zwracane jest w parametrze `resource_id'.
 */
int DLM_init(char *path, resource_id_t *resource_id);

/*
 * 	DML_lock() zakłada blokadę na podany zasób. Jeżeli się nie da czeka maksymalnie `timeout'
 * 	milisekund na zwolnienie zasobu.
 */
int DLM_lock(resource_id_t resource_id, lock_type_t lock_type, timeout_t timeout);

/*
 *	DML_unlock() zwalnia zasób z blokady.
 */
int DLM_unlock(resource_id_t resource_id);

/*
 * 	DLM_trylock() sprawdza mozliwość załorzenia blokady.
 */
int DLM_trylock(resource_id_t resource_id, lock_type_t lock_type);

/*
 * 	Return values of DLM_* functions
 */
#define DLMD_REPLY_BAD_PROCESS			1
#define DLMD_REPLY_BAD_RESOURCE			2
#define DLMD_REPLY_BAD_LOCK				3
// TODO

#endif /* LIBDLM_H_ */
